// 不带参数
const now = new Date()
console.log(now) // 显示当前时间和日期

// ******************************************************************************************************************************

// * 传入的整数参数代表的是自 1970-01-01 00:00:00 以来经过的毫秒数，该整数被称为 时间戳（通常使用这种方式来创建时间）。
// * 如果要获取 1970-01-01 00:00:00 以前的时间，则可以传入负数 new Date(-24 * 3600 * 1000) 来获取。

// 带参数（传入“时间戳（毫秒）”）
const date = new Date(0) // 0 表示最初的时间
console.log(date)

// 带参数（传入字符串）
let date2 = new Date('2024-08-13')
console.log(date2)

// 带参数（使用当前时区中的给定组件创建日期。只有前两个参数是必须的。）
// * new Date(year, month[, day, hours, minutes, seconds, milliseconds])
// year: 应该是4位数
// month: 0（1月）~ 11（12月）
// day: 默认值为1
// hours/minutes/seconds/milliseconds: 默认值为0
let date3 = new Date(2024, 7)
console.log(date3)

// ******************************************************************************************************************************

// * 从 Date 对象中获取日期和时间

// 获取年
const year = new Date().getFullYear()
console.log(year)

// 获取月(0~11) 0代表1月 11代表12月
const month = new Date().getMonth() + 1
console.log(month)

// 获取日(1~31)
const day = new Date().getDate()
console.log(day)

// 获取时
const hours = new Date().getHours()
console.log(hours)

// 获取分
const minutes = new Date().getMinutes()
console.log(minutes)

// 获取秒
const seconds = new Date().getSeconds()
console.log(seconds)

// 获取毫秒
const milliseconds = new Date().getMilliseconds()
console.log(milliseconds)

// 获取一周中的第几天（获取星期几）
const dayOfWeek = new Date().getDay()
console.log(dayOfWeek) // 0（星期日）~ 6（星期六）

// 获取时间戳
const timestamp = new Date().getTime()
console.log(timestamp)
console.log(+new Date()) // 等同于上面的 getTime() 方法

// * 以上的所有方法返回的组件都是基于当前时区；如果需要获取全球标准时间，参考如下。

// * 在获取时区时间的组件方法上加上 UTC，会返回基于 UTC + 0 时区的时间。
// * UTC（协调世界时，Coordinated Universal Time）是全球时间的标准，用于确保世界各地的时钟和时间保持一致。
// 例子：
console.log(new Date().getUTCFullYear())

// * 返回 UTC 本地时区之间的时差，以分钟为单位。
console.log(new Date().getTimezoneOffset())

// ******************************************************************************************************************************

// * 自动校准 是 Date 对象的一个非常方便的特性，我们可以设置超出范围的数值，它会自动校准。

// 例子：月份超出范围，自动往前推。
let date4 = new Date(2024, 13, 1) // 超出范围的月份
console.log(date4.getFullYear(), date4.getMonth(), date4.getDate()) // 2025 1 1（自动前进到了2025年对应的时期）

// 例子2：获取7天之后的日期
let date5 = new Date()
date5.setDate(date5.getDate() + 7)
console.log(date5.getDate()) // 当前日期往后推7天的日期

// 例子3：获取7天前的时间
let date6 = new Date()
date6.setDate(date6.getDate() - 7)
console.log(date6.getDate()) // 当前日期往前推7天的日期

// ******************************************************************************************************************************

// Date.now() 它不会创建中间的 Date 对象。因此它更快，而且不会对垃圾回收造成额外的压力。
// 这种方法很多时候因为方便，又或是因性能方面的考虑而被采用，例如使用 JavaScript 编写游戏或其他的特殊应用场景。

console.log(Date.now()) // 等同于上面的 getTime() 方法

// 例子：判断迭代执行时间
function countdown() {
	const now = Date.now()

	for (let i = 0; i < 10000; i++) {
		let num = i * i * i
	}

	const end = Date.now()

	return end - now
}

console.log(countdown()) // 1ms

// ******************************************************************************************************************************

// Date.parse() 方法可以将一个日期字符串解析为毫秒数（时间戳）。
// 日期字符串格式为：YYYY-MM-DDTHH:mm:ss.sssZ（new Date() 返回的格式就是这样的）。

// YYYY-MM-DD：年-月-日
// T：是一个分隔符
// HH:mm:ss.sss —— 时间：小时，分钟，秒，毫秒。
// 可选字符 'Z' 为 +-hh:mm 格式的时区。单个字符 Z 代表 UTC+0 时区。

// 例子1：
// 56.789秒，没有 Z 表示当前时区，有Z表示 UTC+0 时区（全球标准时间）。
let ms = Date.parse('2024-08-13T12:34:56.789Z')
console.log(ms) // 1723552496789

// 例子2：
let ms2 = Date.parse('2024-08-13 12:34:56')
console.log(ms2) // 1723523696000
